#coding:utf-8
'''
create on 2017-04-20

@author: sandy
'''


import sys,platform
sys.path.append("../")
from twisted.internet import reactor
from pycommon import Daemon
from pycommon import LogManager
from pycommon import RedisDb
from pycommon import RemoteManager
from pycommon import Utils
from pycommon import LogServer
#import LoginWebSite
import ServerConfig
import logging
import PlatformDb
import GameDb
import Center
import ClientFactory
import TimeCheck
import LoginMgr


if 'twisted.internet.reactor' not in sys.modules: 
    if platform.system() == "Linux":
        from twisted.internet import epollreactor
        epollreactor.install()  
    else:
        from twisted.internet import iocpreactor
        iocpreactor.install()


def ServerStart(isdaemon):
    logging.info("############Start LoginServer############")
    RedisDb.instance.start(ServerConfig.instance.redisdb_ip,ServerConfig.instance.redisdb_port,ServerConfig.instance.redisdb_db,ServerConfig.instance.redisdb_passwd)
    PlatformDb.instance.start(ServerConfig.instance.platform_db_name,ServerConfig.instance.platform_db_user,ServerConfig.instance.platform_db_passwd,ServerConfig.instance.platform_db_host,ServerConfig.instance.platform_db_port,ServerConfig.instance.platform_db_linkcount)
    GameDb.instance.start(ServerConfig.instance.game_db_name,ServerConfig.instance.game_db_user,ServerConfig.instance.game_db_passwd,ServerConfig.instance.game_db_host,ServerConfig.instance.game_db_port,ServerConfig.instance.game_db_linkcount)
    #LoginWebSite.instance.start(ServerConfig.instance.web_ip,ServerConfig.instance.web_port)
    ClientFactory.instance.start(ServerConfig.instance.server_ip,ServerConfig.instance.server_port,ServerConfig.instance.max_client)
    LoginMgr.instance.start(ServerConfig.instance.login_manager_ip,ServerConfig.instance.login_manager_port)
    Center.instance.start(ServerConfig.instance.center_ip,ServerConfig.instance.center_port)
    TimeCheck.instance.start()
    LogServer.instance.start(ServerConfig.instance.log_ip,ServerConfig.instance.log_port)
    
def ServerStop():
    LogServer.instance.stop()
    TimeCheck.instance.stop()
    Center.instance.stop()
    #LoginWebSite.instance.stop()
    LoginMgr.instance.stop()
    ClientFactory.instance.stop()
    GameDb.instance.stop()
    PlatformDb.instance.stop()
    RedisDb.instance.stop()

def getConfig(isdaemon):
    configlist = RemoteManager.instance.getConfigList()
    RemoteManager.instance.requestConfig(configlist,ServerStart,isdaemon)

def getServerConfig(isdaemon):
    configlist = [u'server%d.*' % RemoteManager.instance.sid]
    RemoteManager.instance.addConfigCallback(ServerConfig.instance)
    RemoteManager.instance.requestConfig(configlist,getConfig,isdaemon)  

def daemonFunc(isdaemon):
    LogManager.instance.setupLog(RemoteManager.instance.loglevel,RemoteManager.instance.logfile,isdaemon)
    logging.info("############Update LoginServer Config############")
    RemoteManager.instance.start(getServerConfig,isdaemon)
    reactor.run()
    ServerStop()

def run():
    sid, msip, msport, pidpath, logfile, loglevel, pathSelfConfig = Utils.loadDaemonConfig(ServerConfig.instance.rundir)
    RemoteManager.instance.init(sid,msip,msport,logfile, loglevel)
    Daemon.run(pidpath, daemonFunc)

if __name__ == "__main__":
    run()
